home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / comm / tcp / rxsocket.lha / rxsocket / Examples / CheckMail.amirx < prev    next >
Text File  |  1999-05-29  |  5KB  |  202 lines

  1. /* CheckMail 3.16 (20-Oct-1998) by alfie */
  2.  
  3. global.prg="CheckMail"
  4. if ~show("L","rexxsupport.library") then
  5.     if ~addLib("rexxsupport.library",0,-30) then
  6.         call err("can't find rexxsupport.library")
  7. if ~show("L","rxsocket.library") then
  8.     if ~addLib("rxsocket.library",0,-30) then
  9.         call err("can't find rxsocket.library")
  10. if ~show("L","rmh.library") then
  11.     if ~addLib("rmh.library",0,-30) then
  12.         call err("can't find rmh.library")
  13.  
  14. /*******MUST SET THESE!!!*******/
  15. host =                "YOUR POP HOST NAME"
  16. port =                110 /* OR YOUR POP HOST PORT*/
  17. login=                "YOUR LOGIN"
  18. pass=                 "YOU PASSWORD"
  19.  
  20. /*******MAY SET THESE*******/
  21. timeout=              120
  22. global.normalColor=    3
  23. global.mailColor=     4
  24.  
  25. global.color=global.normalColor
  26.  
  27. signal on break_c
  28. global.amirc=left(address(),6)=="AMIRC."
  29. global.prg=ProgramName("NOEXT")
  30.  
  31. global.portName=upper(global.prg)
  32. if show("P",global.portName) then do
  33.     msg="address" global.portName "QUIT"
  34.     p=global.prg
  35.     global.prg="B"p
  36.     call info "signalled" p "to exit."
  37.     interpret msg
  38.     exit
  39. end
  40.  
  41. template="HOST/K,LOGIN/K,PASSWORD=PASS/K,PORT/K/N,TIMEOUT=TOUT/K/N,COLOR/K/N,MAILCOLOR/K/N,HELP/S"
  42. parse arg args
  43. if args=="?" & global.amirc then call err template
  44.  
  45. if ~ReadArgs(template) then call err Fault(IoErr(),global.prg)
  46.  
  47. if parm.0.flag then host=parm.0.value
  48. if parm.1.flag then login=parm.1.value
  49. if parm.2.flag then pass=parm.2.value
  50. if parm.3.flag then port=parm.3.value
  51. if parm.4.flag then timeout=parm.4.value
  52. if parm.5.flag then global.normalColor=parm.5.value
  53. if parm.6.flag then global.mailColor=parm.6.value
  54. global.color=global.normalColor
  55. if parm.7.flag then call help
  56.  
  57. if port=-1 then
  58.     if ~GetServByName("S","pop3","tcp") then port=se.ServPort
  59.     else sin.AddrPort=110
  60. if port<1 | port>65535 then call err "must be 1<=PORT<=65535"
  61. if timeout<0 then call err "TIMEOUT must be non negative"
  62.  
  63. if ~OpenPort(global.portName) then call err "can't open my port"
  64. global.ps=PortSignal(global.portName)
  65.  
  66. if timeout~=0 then do
  67.     global.time=CreateTimer()
  68.     global.ts=TimerSignal(global.time)
  69.     call StartTimer(global.time,timeout)
  70. end
  71. else global.ts=0
  72.  
  73. global.ctrlc=2**12
  74. global.sigbreak=or(global.ctrlc,global.ts,global.ps)
  75. call SetSocketSignals(global.sigbreak)
  76.  
  77. call info "resolving host address..."
  78. remote.AddrAddr=resolve(host)
  79. if remote.AddrAddr==-1 then
  80.     if emptyPort() | CheckSignal(global.ctrlc) then call break_c
  81.     else if CheckSignal(global.ts) then call err "timeout"
  82.          else call err "host <"host"> not found"
  83.  
  84. global.sock=socket("INET","STREAM")
  85. if global.sock<0 then call err "can't create socket"
  86.  
  87. global.sigio=2**AllocSignal()
  88. call SetSocketSignals(global.sigbreak,global.sigio)
  89.  
  90. call IOCtlSocket(global.sock,"FIONBIO",1)
  91. call IoctlSocket(global.sock,"FIOASYNC",1)
  92. call SetSockOpt(global.sock,"SOCKET","EVENTMASK","CONNECT READ WRITE ERROR")
  93. global.mask=or(global.sigbreak,global.sigio)
  94.  
  95. remote.AddrPort=port
  96. call info "connecting..."
  97. res=connect(global.sock,"REMOTE")
  98. call waitev("CONNECT")
  99.  
  100. call info "loggin in..."
  101. call waitev("READ")
  102. call rec
  103.  
  104. call sen("USER alfier")
  105.  
  106. call waitev("READ")
  107. call rec
  108.  
  109. call sen("PASS spognardi")
  110.  
  111. call waitev("READ")
  112. call rec
  113.  
  114. call info "getting statistics..."
  115. call sen("STAT")
  116.  
  117. call waitev("READ")
  118. stat=rec()
  119.  
  120. num=word(stat,2)
  121. if num>0 then do
  122.     global.color=global.mailColor
  123.     msg="you have" num "new mail(s) for total" word(stat,3) "bytes."
  124. end
  125. else msg="you have no new mail."
  126. call info msg
  127.  
  128. call sen("QUIT")
  129. exit
  130.  
  131. rec: procedure expose global.
  132.     len=RecvFromUntil(global.sock,"B",256,"D0A"x)
  133.     if len<1 then call err "error reading",1
  134.     if word(b,1)=="-ERR" then call err right(b,length(b)-wordindex(b,2)+1) "(server error)"
  135.     return b
  136.  
  137. sen: procedure expose global.
  138. parse arg string
  139.     string=string"D0A"x
  140.     res=send(global.sock,string)
  141.     if res~=length(string) then call err "error sending",1
  142.     return
  143.  
  144. waitev: procedure expose global. events.
  145. parse arg ev
  146.     do forever
  147.         sigrec=Wait(global.mask)
  148.         if emptyPort() | and(sigrec,global.ctrlc)~=0 then call break_c
  149.         else if and(sigrec,global.ts)~=0 then call err "timeout"
  150.         s=GetSocketEvents("EVENTS")
  151.         if s>=0 then do
  152.             if events.error then call err "error",1
  153.             if events.ev then return
  154.         end
  155.     end
  156.     return
  157.  
  158. info: procedure expose global.
  159. parse arg msg
  160.     if msg=="" then msg="F"x
  161.     if global.amirc then "ECHO P="d2c(27)"b«"global.prg"» C="global.color msg
  162.     else say msg
  163.     return
  164.  
  165. err: procedure expose global.
  166. parse arg msg,err
  167.     if ~global.amirc then msg=global.prg":" msg
  168.     if err==1 then
  169.         if IsLibOn("TTCP") then more=" (error "errno()")."
  170.         else more=" ("ErrorString(errno())")."
  171.     else more="."
  172.     call info msg || more
  173.     exit
  174.  
  175. break_c: procedure expose global.
  176.     call err "user break detected"
  177.  
  178. emptyPort: procedure expose global.
  179.     res=0
  180.     pkt=GetPkt(global.portName)
  181.     do while pkt~=null()
  182.         call reply(pkt)
  183.         res=1
  184.         pkt=GetPkt(global.portName)
  185.     end
  186.     return res~=0
  187.  
  188. help: procedure expose global.
  189.     call info "CheckMail 3.16 (20-Oct-1998) by alfie"
  190.     call info ""
  191.     call info "HOST/K                    the pop3 host addr to connect"
  192.     call info "LOGIN/K                   the user name"
  193.     call info "PASSWORD=PASS/K           the password"
  194.     call info "PORT/K/N,TIMEOUT=TOUT/K/N global timeout - 0 means none"
  195.     call info "COLOR/K/N                 normal text Amirc color number"
  196.     global.color=global.mailColor
  197.     call info "MAILCOLOR/K/N             new-mail text Amirc color number"
  198.     global.color=global.normalColor
  199.     call info "HELP/S                    show this."
  200.     call info ""
  201.     exit
  202.